#ifndef LIST_H
#define LIST_H

#ifdef __cplusplus
extern "C" {
#endif

struct lnode {
	struct lnode *next;
	struct lnode *prev;
	void *data;
};

// A linked list
typedef struct {
	struct lnode *head;
	struct lnode *tail;
	int size;
} list_t;

// An iterator for a linked list
typedef struct {
	struct lnode *cur;
	struct lnode *fake_head;
} list_iter_t;

list_t *make_list();

void append_list(list_t *, void *);
void prepend_list(list_t *, void *);
void insert_list(list_t *, void *, int);

void *peek_list(list_t *);
void *peek_back_list(list_t *);
void *get_list(list_t *, int);

void *remove_list(list_t *, int);
void *pop_list(list_t *);
void *dequeue_list(list_t *);

list_iter_t *list_get_iter(list_t *);

int list_iter_has_next(list_iter_t *);
int list_iter_has_prev(list_iter_t *);
void *list_iter_next(list_iter_t *);
void *list_iter_prev(list_iter_t *);
void *list_iter_cur(list_iter_t *);

void list_iter_insert(list_iter_t *, void *);
void list_iter_add(list_iter_t *, void *);

void list_iter_destroy(list_iter_t *);

void concat_list(list_t *, list_t *);

void destroy_list(list_t *);

#ifdef __cplusplus
}
#endif

#endif /* !LIST_H */
